#!/usr/bin/env python

import unittest

from datamanager import DataManager, DataManagerDeadlock


class DataManager_Test( unittest.TestCase ):
    def setUp( self ):
        self.dm = DataManager()
    # setUp()

    def testSlock( self ):
        self.assertEqual( self.dm.slock( 1, 1 ), True )
        self.assertEqual( self.dm.slock( 2, 1 ), True )
        self.assertEqual( self.dm.slock( 3, 1 ), True )
    # testSlock()


    def testXlock( self ):
        self.assertEqual( self.dm.xlock( 1, 1 ), True )
        self.assertRaises( DataManagerDeadlock, self.dm.xlock, 2, 1 )
        self.assertRaises( DataManagerDeadlock, self.dm.xlock, 3, 1 )

        self.assertEqual( self.dm.xlock( 1, 2 ), True )
        self.assertEqual( self.dm.xlock( 2, 3 ), True )
        self.assertEqual( self.dm.xlock( 3, 4 ), True )
    # testSlock()


    def testIsSlock( self ):
        self.assertEqual( self.dm.is_slocked( 1 ), False )
        self.assertEqual( self.dm.is_slocked( 2 ), False )

        self.dm.slock( 1, 1 )
        self.assertEqual( self.dm.is_slocked( 1 ), True )
        self.assertEqual( self.dm.is_slocked( 2 ), False )
    # testIsSlock()


    def testIsXlock( self ):
        self.assertEqual( self.dm.is_xlocked( 1 ), False )
        self.assertEqual( self.dm.is_xlocked( 2 ), False )

        self.dm.xlock( 1, 1 )
        self.assertEqual( self.dm.is_xlocked( 1 ), True )
        self.assertEqual( self.dm.is_xlocked( 2 ), False )
    # testIsXlock()


    def testRelock( self ):
        self.dm.slock( 1, 1 )
        self.assertEqual( self.dm.xlock( 1, 1 ), True )
    # testRelock()


    def testUnlock( self ):
        self.dm.slock( 1, 1 )
        self.dm.unlock( 1, 1 )
        self.assertEqual( self.dm.is_slocked( 1 ), False )
        self.assertEqual( self.dm.is_xlocked( 1 ), False )

        self.dm.xlock( 1, 1 )
        self.dm.unlock( 1, 1 )
        self.assertEqual( self.dm.is_slocked( 1 ), False )
        self.assertEqual( self.dm.is_xlocked( 1 ), False )

        self.dm.slock( 1, 1 )
        self.dm.xlock( 1, 1 )
        self.dm.unlock( 1, 1 )
        self.assertEqual( self.dm.is_slocked( 1 ), False )
        self.assertEqual( self.dm.is_xlocked( 1 ), False )
    # testUnlock()


    def testSanitySlock( self ):
        self.assertEqual( self.dm.is_unlocked( 1 ), True )
        self.assertEqual( self.dm.slock( 1, 1 ), True )
        self.assertEqual( self.dm.is_unlocked( 1 ), False )
        self.assertEqual( self.dm.is_slocked( 1 ), True )
        self.assertEqual( self.dm.is_xlocked( 1 ), False )
        self.assertEqual( self.dm.is_slocked_tid( 1, 1 ), True )
        self.assertEqual( self.dm.is_slocked_just_tid( 1, 1 ), True )
        self.assertEqual( self.dm.unlock( 1, 1 ), True )
        self.assertEqual( self.dm.is_unlocked( 1 ), True )

        self.assertEqual( self.dm.slock( 2, 1 ), True )
        self.assertEqual( self.dm.is_slocked_just_tid( 1, 1 ), False )

        self.assertEqual( self.dm.unlock( 1, 1 ), False ) # Still locked to 2

        self.assertEqual( self.dm.is_slocked_just_tid( 1, 1 ), False )
        self.assertEqual( self.dm.is_slocked_just_tid( 2, 1 ), True )

        self.assertEqual( self.dm.unlock( 2, 1 ), True )
        self.assertEqual( self.dm.is_slocked_just_tid( 1, 1 ), False )
        self.assertEqual( self.dm.is_slocked_just_tid( 2, 1 ), False )
    # testSanitySlock()

    def testSanityXlock( self ):
        self.assertEqual( self.dm.is_unlocked( 1 ), True )
        self.assertEqual( self.dm.xlock( 1, 1 ), True )
        self.assertEqual( self.dm.is_unlocked( 1 ), False )
        self.assertEqual( self.dm.is_slocked( 1 ), True )
        self.assertEqual( self.dm.is_xlocked( 1 ), True )
        self.assertEqual( self.dm.unlock( 1, 1 ), True )
        self.assertEqual( self.dm.is_unlocked( 1 ), True )

        self.assertEqual( self.dm.slock( 1, 1 ), True )
        self.assertEqual( self.dm.xlock( 1, 1 ), True )
        self.assertEqual( self.dm.is_unlocked( 1 ), False )
        self.assertEqual( self.dm.is_slocked( 1 ), True )
        self.assertEqual( self.dm.is_xlocked( 1 ), True )

        self.assertEqual( self.dm.unlock( 1, 1 ), True )
        self.assertEqual( self.dm.is_unlocked( 1 ), True )
    # testSanityXlock()


    def testSanityUnlockAll( self ):
        self.assertEqual( self.dm.is_unlocked( 1 ), True )
        self.assertEqual( self.dm.slock( 1, 1 ), True )
        self.assertEqual( self.dm.slock( 1, 2 ), True )
        self.assertEqual( self.dm.is_slocked( 1 ), True )
        self.assertEqual( self.dm.is_slocked_just_tid( 1, 1 ), True )
        self.assertEqual( self.dm.is_slocked_just_tid( 1, 2 ), True )
        self.assertEqual( self.dm.unlock_all( 1 ), None )
        self.assertEqual( self.dm.is_unlocked( 1 ), True )
        self.assertEqual( self.dm.is_unlocked( 2 ), True )
    # testSanityUnlockAll()
# DataManager_Test



if __name__ == "__main__":
    unittest.main()
# endif
